home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1994 November: Tool Chest / Dev.CD Nov 94.toast / New System Software Extensions / OpenDoc A6 / OpenDoc Parts Framework / OPF / Found / FWArchiv / Sources / FWLocMap.cpp < prev    next >
Encoding:
Text File  |  1994-04-21  |  4.2 KB  |  92 lines  |  [TEXT/MPS ]

  1. //========================================================================================
  2. //
  3. //    File:                FWLocMap.cpp
  4. //    Release Version:    $ 1.0d1 $
  5. //
  6. //    Creation Date:        3/28/94
  7. //
  8. //    Copyright:    © 1994 by Apple Computer, Inc., all rights reserved.
  9. //
  10. //========================================================================================
  11.  
  12. #ifndef FWARCHIV_H
  13. #include "FWArchiv.h"
  14. #endif
  15.  
  16. //========================================================================================
  17. // Any DLL that declares dynamically archivable classes must have its own local copies
  18. // of two FW_CDynamicArchiver maps.  This .cpp file declares storage for these local maps.
  19. // The compile output (.obj) of this file must be *statically* linked into *each* DLL
  20. // that declares archivable classes.  Also, the application .exe must call 
  21. // MergeArchiverMaps for each DLL.  To accomplish this last task, it is necessary
  22. // to create a uniquely named function for each DLL that simply calls
  23. // MergeArchiverMaps.  The .exe then calls all of these uniquely named functions.
  24. //========================================================================================
  25.  
  26.  
  27. //----------------------------------------------------------------------------------------
  28. //    FW_CDynamicArchiver Local maps
  29. //
  30. //        These maps cannot be a static objects, because we must guarantee
  31. //        that they are initialized before any FW_CDynamicArchiver is initialized.
  32. //        We achieve this by using the accessor functions below.  The first time the
  33. //        accessor function is called, the corresponding data structure is initialized.
  34. //
  35. //----------------------------------------------------------------------------------------
  36.  
  37. FW_CDynamicArchiver::MapNameToLabel * FW_CDynamicArchiver::gLocalMapClassNameToClassLabel = 0;
  38. FW_CDynamicArchiver::MapLabelToIOFunction * FW_CDynamicArchiver::gLocalMapClassLabelToObjectIOFunction = 0;
  39.  
  40. //----------------------------------------------------------------------------------------
  41. //    FW_CDynamicArchiver::GetLocalMapNameToLabel
  42. //----------------------------------------------------------------------------------------
  43.  
  44. FW_CDynamicArchiver::MapNameToLabel& FW_CDynamicArchiver::GetLocalMapNameToLabel()
  45. {
  46.     if (gLocalMapClassNameToClassLabel == 0)
  47.     {
  48.         gLocalMapClassNameToClassLabel = new MapNameToLabel(HashFunction);
  49.         gLocalMapClassNameToClassLabel->SetChunkSize(kChunkSize);
  50.     }
  51.     return *gLocalMapClassNameToClassLabel;
  52. }
  53.  
  54. //----------------------------------------------------------------------------------------
  55. //    FW_CDynamicArchiver::GetLocalMapLabelToIOFunction
  56. //----------------------------------------------------------------------------------------
  57.  
  58. FW_CDynamicArchiver::MapLabelToIOFunction& FW_CDynamicArchiver::GetLocalMapLabelToIOFunction()
  59. {
  60.     if (gLocalMapClassLabelToObjectIOFunction == 0)
  61.     {
  62.         gLocalMapClassLabelToObjectIOFunction = new MapLabelToIOFunction(HashFunction);
  63.         gLocalMapClassLabelToObjectIOFunction->SetChunkSize(kChunkSize);
  64.     }
  65.     return *gLocalMapClassLabelToObjectIOFunction;
  66. }
  67.  
  68. //----------------------------------------------------------------------------------------
  69. //    FW_CDynamicArchiver::MergeArchiverMaps
  70. //
  71. //        This function will work if and only if it is statically linked into *each*
  72. //        DLL that has archivable class infos.  Each copy of this function must be
  73. //        called during application initialization (before any objects are read from
  74. //        or written to an archive.  Since all copies have the same name, the DLL
  75. //        developer must provide a uniquely named function that calls this function,
  76. //        and then arrange for that function to be statically linked to this function.
  77. //        The application developer can then call the uniquely named, DLL-specific function.
  78. //        Note that for safety, this function should not be exported if the build
  79. //        environment supports that feature (just about all Windows build environments
  80. //        do noexport by default, but FWBuild currently arranges to export all functions).
  81. //
  82. //----------------------------------------------------------------------------------------
  83.  
  84. void FW_CDynamicArchiver::MergeArchiverMaps() 
  85. {
  86.     MergeNameToLabelMaps(FW_CDynamicArchiver::GetLocalMapNameToLabel(),
  87.                         FW_CDynamicArchiver::GetMapNameToLabel());
  88.     MergeLabelToIOFunctionMaps(FW_CDynamicArchiver::GetLocalMapLabelToIOFunction(),
  89.                                 FW_CDynamicArchiver::GetMapLabelToIOFunction());
  90. }
  91.  
  92.